//
//  NSDate+Utils.h
//  iOSCodeProject
//
//  Created by Fox on 14-7-18.
//  Copyright (c) 2014年 翔傲信息科技（上海）有限公司. All rights reserved.
//

#import <Foundation/Foundation.h>
//#import "DateTools.h"
/**
 *  时间NSDate扩展类别
 */
@interface NSDate (Utils)

#pragma mark - Date Property

/**
 *  当前日期的年
 *
 *  @return 年
 */
-(NSInteger)year;

/**
 *  当前日期的时代
 *   [Era]是公元的意思, 现在的日期都会为1
 *  @return 时代
 */
-(NSInteger)era;

/**
 *  当前月
 *
 *  @return 月
 */
-(NSInteger)month;


/**
*  当前天(当月)
*
*  @return 天
*/
-(NSInteger)dayOfMonth;

/**
* 一年的的总天数
*/
-(NSInteger)countdaysInYear;

/**
*  改年的多少天
*
*  @return 天
*/
-(NSInteger)dayInYear;

/**
*  当月对应的多少天
*
*  @return 天数
*/
-(NSInteger)numDaysInMonth;

/**
* 一月的的总天数(指定月份) （1.。。12）
*/
-(NSInteger)countDaysInMonth:(NSInteger)month;

/**
* 一月的的总天数
*/
-(NSInteger)countDaysInMonth;

/**
* 一年的的总周数
 * 52*7=364
 * 一年至少364天,还多余2天,最少53周,最多54周
*/
-(NSInteger)countWeeksInYear;

/**
*  当前周
*  @return 该年第几周
*/
-(NSInteger)weekOfYear;

/**
*  当前周
*  @return 该月第几周 (指该日期是本月的第几周。一周从星期日开始。)
*/
-(NSInteger)weekOfMonth;

/**
 * weekdayOrdinal是指该日期是本月的第几个星期几
 * weekdayOrdinal是指该日期是本月的第几个星期几。有点混乱啊。结合weekOfMonth举个例子：
 * 如果本月是从周二开始的，即1号是周二，2号是周三，6号是周日，7号是周一，8号是第二个周二。
 * 那么如果日期设定为1，2，3，4，5号的话，则weekOfMonth和weekdayOrdinal都是1。
 * 那么如果日期设定为6，7号的话，则weekOfMonth是2，但是weekdayOrdinal却是1，因为6号虽然是第二周，但是却是本月第一个周日，同样7号虽然也是第二周，但是却是本月第一个周一。
 *
 * 那么如果日期设定为8，9，10......号的话，则weekOfMonth和weekdayOrdinal都是2。
 */
-(NSInteger)weekdayOrdinal;

/**
 * weekday是该日期是这一周中第几天。范围是从1－7。星期日是1

 */
-(NSInteger)weekday;

-(NSInteger)yearForWeekOfYear;


/**
* 是否是闰年
*/
-(BOOL)isLeapYear;

/**
* 是否是闰月
*/
-(BOOL)isLeapMonth;

#pragma mark - Format Date

/**
 *  当前时间字符串，年、月、日
 *
 *  @return 时间字符串
 */
+ (NSString *)currentTimeString;

/**
 *  当前时间字符串，除了年、月和日，还包含小时、分钟和秒
 *
 *  @return 时间字符串
 */
+ (NSString *)currentFullTimeString;

/**
 *  当前时间字符串，只包含小时、分钟和秒
 *
 *  @return 时间字符串
 */
+ (NSString *)currentDetailTimeString;

/**
 *  通过一定格式的字符串转换为NSDate时间对象
 *
 *  @param dateString          时间字符串
 *  @param dateFormatterString 时间格式字符串
 *
 *  @return 时间对象
 */
+ (NSDate*)dateWithString:(NSString*)dateString
             formatString:(NSString*)dateFormatterString;

/**
 *  通过'yyyy-MM-dd HH:mm:ss' 格式的字符串获取NSDate时间对象
 *
 *  @param str 时间字符串
 *
 *  @return 时间对象
 */
+ (NSDate*)dateWithDateString:(NSString*)str;

/**
 *  通过'yyyy-MM-dd HH:mm:ss' 格式的字符串获取NSDate时间对象
 *
 *  @param str 时间字符串
 *
 *  @return 时间对象
 */
+ (NSDate*)dateWithDateTimeString:(NSString*)str;

/**
 *  按照一定的格式返回时间对象的字符串，如"yyyy-MM-dd",则只返回年月日
 *
 *  @param formatString 格式字符串
 *
 *  @return 时间对应格式的字符串
 */
- (NSString *)formatStringWithFormat:(NSString *)formatString;

/**
 *  将时间戳修改为时间对象
 *
 *  @param timestamp 时间戳
 *
 *  @return 时间对象
 */
+ (NSString *)dateFormTimestampString:(NSString *)timestamp;

+ (NSString *)dateFormTimestampString:(NSString *)timestamp format:(NSString *)format;

/**
 *  将时间戳修改为时间对象
 *
 *  @param timestamp 时间戳[需要除以1000]
 *
 *  @return 时间对象
 */
+ (NSString *)dateFormMoreTimestampString:(NSString *)timestamp format:(NSString *)format;


/**
 *  将秒数转换为天、小时、分和秒；例如111230转换为3天5小时42分12秒
 *
 *  @param count 秒
 *
 *  @return 描述文字
 */
+ (NSString *)dateFormmterFormSecond:(int)count;

+ (NSString *)dateFormmterFormSecond2:(int)count;

/**
 *  将时间修改为刚刚、2分钟前、2小时前和2天前描述的字符串
 *
 *  @return 结果字符串
 */
- (NSString*)formattedExactRelativeDate;

/**
 *  过去多少天对应的时间
 *
 *  @param pageDays 天数
 *
 *  @return 时间描述字符串
 */
+ (NSString *)pastDateString:(int )pageDays;

/**
 *  未来的多少天
 *
 *  @param pageDays 天数
 *
 *  @return 时间描述字符串
 */
+ (NSString *)addDateString:(int )pageDays;

/**
 *  未来的多少月
 *
 *  @param pastMonth 过去月数
 *
 *  @return 时间描述字符串
 */
+ (NSString *)pastMonthDateString:(int )pastMonth;
+ (NSString *)ymmdateFormTimestampString:(NSString *)timestamp;
+ (NSString *)homeNewsdateFormTimestampString:(NSString *)timestamp;
#pragma mark - Time comparison

/**
 *  是否早于现在
 *
 *  @return 计较结果
 */
- (BOOL)isPastDate;

/**
 *  是否为今天
 *
 *  @return 比较结果
 */
- (BOOL)isDateToday;

/**
 *  是否为昨天
 *
 *  @return 比较结果
 */
- (BOOL)isDateYesterday;

@end
